<?php

namespace app\logic\language;

use app\logic\BaseLogic;
use think\db\exception\DataNotFoundException;
use think\db\exception\DbException;
use think\db\exception\ModelNotFoundException;
use think\facade\Lang;
use think\facade\Log;

class LangLogic extends BaseLogic
{

    /**
     * 同步翻译数据
     *
     * 本函数的目的是在不同语言之间同步翻译关键词，确保每个关键词在每种语言中都有对应的翻译记录
     * 即使翻译内容为空，也要确保数据库中存在相应的记录，以便于后续的翻译工作
     *
     * @return bool 返回一个布尔值，表示翻译同步操作是否成功
     */
    public static function syncTranslate(): bool
    {

        try {
            // 初始化语言、关键词和翻译模型
            $language = new \app\admin\model\Language();
            $keywords = new \app\admin\model\language\Keywords();
            $translate = new \app\admin\model\language\Translate();

            // 获取语言列表和关键词列表
            $languageList = $language->getLangList();
            $keywordsList = $keywords->field('id, keyword')->select()->toArray();

            // 遍历每种语言和每个关键词，以创建或更新翻译记录
            foreach ($languageList as $languageItem) {
                foreach ($keywordsList as $keywordsItem) {
                    // 构建查询条件，以查找特定语言和关键词的翻译记录
                    $where = [
                        'language_id' => $languageItem['id'],
                        'language_keywords_id' => $keywordsItem['id']
                    ];

                    // 检查记录是否已存在
                    $exists = $translate->where($where)->find();
                    if (!$exists) {
                        // 如果不存在，则插入
                        $translate->insert([
                            'language_id' => $languageItem['id'],
                            'language_keywords_id' => $keywordsItem['id'],
                            'create_time' => time(),
                        ]);
                    }
                }
            }
        } catch (DataNotFoundException|ModelNotFoundException|DbException $e) {
            // 记录异常信息，以便于调试和排查问题
            Log::channel('my')->error($e->getMessage().PHP_EOL.$e->getTraceAsString());

            return false;
        }

        // 返回成功，表示同步操作完成
        return true;
    }


    /**
     * 获取语言
     * @param string $lang
     * @return array
     */
    public static function getLang(string $lang = ''): array
    {
        $lang = $lang ?: Lang::getLangSet();
        $cache = \think\facade\Cache::get('lang');
        if (!$cache) {
            try {
                $translate = new \app\admin\model\language\Translate();

                $translateList = $translate->withJoin(['language', 'languageKeywords'], 'LEFT')->field('language_id, language_keywords_id, keyword_translate')->select()->toArray();
                $cache = [];
                foreach ($translateList as $item) {
                    $cache[$item['language']['lang']][strtolower($item['languageKeywords']['keyword'])] = $item['keyword_translate'];
                }
                \think\facade\Cache::set('lang', $cache);
            } catch (DataNotFoundException|ModelNotFoundException|DbException $e) {
                Log::channel('my')->error($e->getMessage().PHP_EOL.$e->getTraceAsString());
                return [];
            }
        }
        return $cache[$lang] ?? [];
    }

    /**
     * 清除语言包缓存
     *
     * 本函数通过调用 think\facade\Cache::clear 方法来清除名为 'lang' 的缓存，
     * 以实现语言包缓存的清理功能缓存清除后，可以确保语言包的最新内容被加载，
     * 避免由于缓存导致的语言内容更新后未即时生效的问题
     *
     * @return bool 返回缓存清除操作的结果，true 表示成功，false 表示失败
     */
    public static function clearLangCache(): bool
    {
         \think\facade\Cache::delete('lang');
         //从新生成缓存
         self::getLang();
         return true;
    }

    /**
     * 语言包列表
     * @return array
     * @throws DataNotFoundException
     * @throws DbException
     * @throws ModelNotFoundException
     */
    public static function getLangList(): array
    {
        $language = new \app\admin\model\Language();
        return $language->where('status', 1)->order('weight desc')->field('lang, name')->select()->toArray();
    }
}